ParametrizeCamera_LineScanIOSettings.py

Configure IO Settings of Line Scan Camera

It shows how to configure node IO settings of frame trigger and line trigger for line scan camera by calling MV_CC_SetEnumValue().

1 # -- coding: utf-8 --
2 
3 import sys
4 import os
5 import platform
6 
7 # Compatible with different operating systems to load DDL
8 currentsystem = platform.system()
9 if currentsystem == 'Windows':
10  sys.path.append(os.path.join(os.getenv('MVCAM_COMMON_RUNENV'), "Samples", "Python", "MvImport"))
11 else:
12  sys.path.append(os.path.join("..", "..", "MvImport"))
13 from MvCameraControl_class import *
14 
15 # Compatible with input processing of Python 2.X and 3.X
16 if sys.version_info[0] < 3:
17  # Python 2.x
18  input_func = raw_input
19 else:
20  # Python 3.x
21  input_func = input
22 
23 # Decoding Characters
24 def decoding_char(ctypes_char_array):
25  """
26  Safely decode a string from a ctypes character array.
27  Compatible with Python 2.x and 3.x, as well as 32-bit and 64-bit environments.
28  """
29  byte_str = memoryview(ctypes_char_array).tobytes()
30 
31  # Truncate at the first null character
32  null_index = byte_str.find(b'\x00')
33  if null_index != -1:
34  byte_str = byte_str[:null_index]
35 
36  # Attempt to decode using multiple encodings
37  for encoding in ['gbk', 'utf-8', 'latin-1']:
38  try:
39  return byte_str.decode(encoding)
40  except UnicodeDecodeError:
41  continue
42 
43  # If all encodings fail, use a replacement strategy
44  return byte_str.decode('latin-1', errors='replace')
45 
46 fun_ctype = get_platform_functype()
47 stFrameInfo = POINTER(MV_FRAME_OUT_INFO_EX)
48 pData = POINTER(c_ubyte)
49 FrameInfoCallBack = fun_ctype(None, pData, stFrameInfo, c_void_p)
50 
51 def image_callback(pData, pFrameInfo, pUser):
52  stFrameInfo = cast(pFrameInfo, POINTER(MV_FRAME_OUT_INFO_EX)).contents
53  if stFrameInfo:
54  print("get one frame: Width[%d], Height[%d], nFrameNum[%d]" % (stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nFrameNum))
55 
56 CALL_BACK_FUN = FrameInfoCallBack(image_callback)
57 
58 
59 def check_feature_node_access(cam_ins, node_name):
60  access_mode = MV_XML_AccessMode()
61  res = cam_ins.MV_XML_GetNodeAccessMode(node_name, access_mode)
62  if res != 0:
63  return False
64  if access_mode == AM_WO or access_mode == AM_RO or access_mode == AM_RW:
65  return True
66  else:
67  return False
68 
69 
70 if __name__ == "__main__":
71 
72  try:
73  # Initialize SDK resources
74  MvCamera.MV_CC_Initialize()
75 
76  SDKVersion = MvCamera.MV_CC_GetSDKVersion()
77  print ("SDKVersion[0x%x]" % SDKVersion)
78 
79  deviceList = MV_CC_DEVICE_INFO_LIST()
80  tlayerType = (MV_GIGE_DEVICE | MV_USB_DEVICE | MV_GENTL_CAMERALINK_DEVICE
81  | MV_GENTL_CXP_DEVICE | MV_GENTL_XOF_DEVICE)
82 
83  # Enumerate devices
84  ret = MvCamera.MV_CC_EnumDevices(tlayerType, deviceList)
85  if ret != 0:
86  print("enum devices fail! ret[0x%x]" % ret)
87  sys.exit()
88 
89  if deviceList.nDeviceNum == 0:
90  print("find no device!")
91  sys.exit()
92 
93  print("Find %d devices!" % deviceList.nDeviceNum)
94 
95  for i in range(0, deviceList.nDeviceNum):
96  mvcc_dev_info = cast(deviceList.pDeviceInfo[i], POINTER(MV_CC_DEVICE_INFO)).contents
97  if mvcc_dev_info.nTLayerType == MV_GIGE_DEVICE or mvcc_dev_info.nTLayerType == MV_GENTL_GIGE_DEVICE:
98  print("\ngige device: [%d]" % i)
99  strModeName = decoding_char(mvcc_dev_info.SpecialInfo.stGigEInfo.chModelName)
100  print ("device model name: %s" % strModeName)
101  strSerialNumber = decoding_char(mvcc_dev_info.SpecialInfo.stGigEInfo.chSerialNumber)
102  print("device serial number: %s" % strSerialNumber)
103  nip1 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24)
104  nip2 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16)
105  nip3 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8)
106  nip4 = (mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff)
107  print ("current ip: %d.%d.%d.%d\n" % (nip1, nip2, nip3, nip4))
108  elif mvcc_dev_info.nTLayerType == MV_USB_DEVICE:
109  print ("\nu3v device: [%d]" % i)
110  strModeName = decoding_char(mvcc_dev_info.SpecialInfo.stUsb3VInfo.chModelName)
111  print ("device model name: %s" % strModeName)
112 
113  strSerialNumber = decoding_char(mvcc_dev_info.SpecialInfo.stUsb3VInfo.chSerialNumber)
114  print ("device serial number: %s" % strSerialNumber)
115  elif mvcc_dev_info.nTLayerType == MV_GENTL_CAMERALINK_DEVICE:
116  print ("\nCML device: [%d]" % i)
117  strModeName = decoding_char(mvcc_dev_info.SpecialInfo.stCMLInfo.chModelName)
118  print ("device model name: %s" % strModeName)
119 
120  strSerialNumber = decoding_char(mvcc_dev_info.SpecialInfo.stCMLInfo.chSerialNumber)
121  print ("device serial number: %s" % strSerialNumber)
122  elif mvcc_dev_info.nTLayerType == MV_GENTL_CXP_DEVICE:
123  print ("\nCXP device: [%d]" % i)
124  strModeName = decoding_char(mvcc_dev_info.SpecialInfo.stCXPInfo.chModelName)
125  print ("device model name: %s" % strModeName)
126 
127  strSerialNumber = decoding_char(mvcc_dev_info.SpecialInfo.stCXPInfo.chSerialNumber)
128  print ("device serial number: %s" % strSerialNumber)
129  elif mvcc_dev_info.nTLayerType == MV_GENTL_XOF_DEVICE:
130  print ("\nXoF device: [%d]" % i)
131  strModeName = decoding_char(mvcc_dev_info.SpecialInfo.stXoFInfo.chModelName)
132  print ("device model name: %s" % strModeName)
133 
134  strSerialNumber = decoding_char(mvcc_dev_info.SpecialInfo.stXoFInfo.chSerialNumber)
135  print ("device serial number: %s" % strSerialNumber)
136 
137  nConnectionNum = input_func("please input the number of the device to connect:")
138 
139  if int(nConnectionNum) >= deviceList.nDeviceNum:
140  print("input error!")
141  sys.exit()
142 
143  nTriggerIndex = input_func("Please Input trigger selector index: 0-FrameTrigger, 1-LineTrigger:")
144  if int(nTriggerIndex) not in {0, 1}:
145  print("input error!")
146  sys.exit()
147 
148  # Create a camera instance
149  cam = MvCamera()
150 
151  # Select a device, and create a handle
152  stDeviceList = cast(deviceList.pDeviceInfo[int(nConnectionNum)], POINTER(MV_CC_DEVICE_INFO)).contents
153 
154  ret = cam.MV_CC_CreateHandle(stDeviceList)
155  if ret != 0:
156  raise Exception("create handle fail! ret[0x%x]" % ret)
157 
158  # Turn on the device
159  ret = cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
160  if ret != 0:
161  raise Exception("open device fail! ret[0x%x]" % ret)
162 
163  # Get optimal packet size (only supported by GigE devices)
164  if stDeviceList.nTLayerType == MV_GIGE_DEVICE or stDeviceList.nTLayerType == MV_GENTL_GIGE_DEVICE:
165  nPacketSize = cam.MV_CC_GetOptimalPacketSize()
166  if int(nPacketSize) > 0:
167  ret = cam.MV_CC_SetIntValue("GevSCPSPacketSize", nPacketSize)
168  if ret != 0:
169  print("Warning: Set Packet Size fail! ret[0x%x]" % ret)
170  else:
171  print("Warning: Get Packet Size fail! ret[0x%x]" % nPacketSize)
172 
173  # Pre-set frame trigger of line scan camera
174  if int(nTriggerIndex) == 0:
175  ret = cam.MV_CC_SetEnumValueByString("ScanMode", "FrameScan")
176  if ret == 0:
177  print("set frame scan mode")
178 
179  # Check if FrameTriggerControl is readable
180  if check_feature_node_access(cam, "FrameTriggerControl"):
181  # Set trigger mode to on
182  ret = cam.MV_CC_SetBoolValue("FrameTriggerMode", True)
183  if ret != 0:
184  raise Exception("set frame trigger mode on fail! ret[0x%x]" % ret)
185  # Set trigger source to Line0
186  ret = cam.MV_CC_SetEnumValue("FrameTriggerSource", 0)
187  if ret != 0:
188  raise Exception("set trigger source line0 fail! ret[0x%x]" % ret)
189  else:
190  # Set trigger selector to FrameBurstStart
191  ret = cam.MV_CC_SetEnumValue("TriggerSelector", 6)
192  if ret != 0:
193  raise Exception("set trigger selector fail! ret[0x%x]" % ret)
194 
195  # Set trigger mode to on
196  ret = cam.MV_CC_SetEnumValue("TriggerMode", 1)
197  if ret != 0:
198  raise Exception("set trigger mode fail! ret[0x%x]" % ret)
199 
200  # Set trigger source to Line0
201  ret = cam.MV_CC_SetEnumValue("TriggerSource", 0)
202  if ret != 0:
203  raise Exception("set trigger source fail! ret[0x%x]" % ret)
204  # Pre-set line trigger of line scan camera
205  else:
206  # Check if FrameTriggerControl is readable
207  if check_feature_node_access(cam, "LineTriggerControl"):
208  # Set trigger mode to on
209  ret = cam.MV_CC_SetBoolValue("LineTriggerMode", True)
210  if ret != 0:
211  raise Exception("set trigger mode fail! ret[0x%x]" % ret)
212  # Set trigger source to EncoderModuleOut
213  ret = cam.MV_CC_SetEnumValue("LineTriggerSource", 6)
214  if ret != 0:
215  raise Exception("set trigger source fail! ret[0x%x]" % ret)
216  else:
217  # Set trigger selector to LineStart
218  ret = cam.MV_CC_SetEnumValue("TriggerSelector", 9)
219  if ret != 0:
220  raise Exception("set trigger selector fail! ret[0x%x]" % ret)
221 
222  # Set trigger mode to on
223  ret = cam.MV_CC_SetEnumValue("TriggerMode", 1)
224  if ret != 0:
225  raise Exception("set trigger mode fail! ret[0x%x]" % ret)
226 
227  # Set trigger source to EncoderModuleOut
228  ret = cam.MV_CC_SetEnumValue("TriggerSource", 6)
229  if ret != 0:
230  raise Exception("set trigger source fail! ret[0x%x]" % ret)
231 
232  # Set encoder selector to Encoder0
233  ret = cam.MV_CC_SetEnumValue("EncoderSelector", 0)
234  if ret != 0:
235  raise Exception("set encoder selector fail! ret[0x%x]" % ret)
236 
237  # Set encoder data source A to Line1
238  ret = cam.MV_CC_SetEnumValue("EncoderSourceA", 1)
239  if ret != 0:
240  raise Exception("set encoder sourceA fail! ret[0x%x]" % ret)
241 
242  # Set encoder data source B to Line3
243  ret = cam.MV_CC_SetEnumValue("EncoderSourceB", 3)
244  if ret != 0:
245  raise Exception("set encoder sourceB fail! ret[0x%x]" % ret)
246 
247  #Register an image grabbing callback
248  ret = cam.MV_CC_RegisterImageCallBackEx(CALL_BACK_FUN, None)
249  if ret != 0:
250  raise Exception("register image callback fail! ret[0x%x]" % ret)
251 
252  # Start grabbing images
253  ret = cam.MV_CC_StartGrabbing()
254  if ret != 0:
255  raise Exception("start grabbing fail! ret[0x%x]" % ret)
256 
257  print ("press Enter key to stop grabbing.")
258  input_func()
259 
260  # Stop grabbing images
261  ret = cam.MV_CC_StopGrabbing()
262  if ret != 0:
263  raise Exception("stop grabbing fail! ret[0x%x]" % ret)
264 
265  # Turn off the device
266  ret = cam.MV_CC_CloseDevice()
267  if ret != 0:
268  raise Exception("close device fail! ret[0x%x]" % ret)
269 
270  # Destroy the handle
271  cam.MV_CC_DestroyHandle()
272 
273  except Exception as e:
274  print(e)
275  cam.MV_CC_CloseDevice()
276  cam.MV_CC_DestroyHandle()
277  finally:
278  # Release SDK resources
279  MvCamera.MV_CC_Finalize()